package com.changgou.order.interceptor;


import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Enumeration;

/*
用来在调用feign的时候，添加生成令牌，便于让此服务调用其他的服务

这里是由于用户在看订单的时候，需要调用godds微服务，然后godds微服务是需认证的，不是所有的
操作都可以暴露给用户
 */

//把这个提取到了公共工具，谁用可以new 调用   在 启动器中   记得加been

/**
 * 大概形式
 * @Been
 * new FeignInterceptor
 * return feignInterceptor
 */
@Configuration
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        /***
         *      获取当前调用本方法用户的令牌
         *      将令牌封装到头文件中
         */

        /*
        这当开启熔断器之后就会造成每次创建新的线程，那数据就拿不到了，而用户每次请求的时候对应的数据在当前线程，如果开启了熔断，默认是线程池隔离
        会开启新的线程
        解决办法：需要将熔断策略换成信号量隔离，此时不会开启新的线程
         */
        //记录了当前用户请求本应用的所有数据，包含了请求头，参数等
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //获取所有头的名字
        Enumeration<String> headerNames = requestAttributes.getRequest().getHeaderNames();
        //判断是否还有下一个元素
        //循环取所有的头和值
        while (headerNames.hasMoreElements()){
            //获取请求头的key
            String headerKey = headerNames.nextElement();
            //根据key获取对应的值
            String headerValue = requestAttributes.getRequest().getHeader(headerKey);
            //将请求头信息封装到头中，使用feign调用的时候，会传递给下一个微服务，用于认证
            requestTemplate.header(headerKey,headerValue);
        }
    }
}
